const COS = require('cos-nodejs-sdk-v5');

/**
 * 腾讯云对象存储服务
 * 提供项目数据的云端存储和同步功能
 */
class COSService {
  constructor() {
    // 腾讯云COS配置
    this.config = {
      SecretId: 'AKIDvx7ERG4nOpV9h5LRM709KNJ9xtsjnwCK',
      SecretKey: '4z8A3oU2QirpdLuNgopgNtYbaVH6rW1S',
      Bucket: 'baoqu-host-manager-1252921383',
      Region: 'ap-guangzhou'
    };

    // 初始化COS客户端
    this.cos = new COS({
      SecretId: this.config.SecretId,
      SecretKey: this.config.SecretKey
    });

    // 云端文件路径
    this.cloudFilePath = 'config/project.json';
  }

  /**
   * 上传数据到腾讯云
   * @param {Object} data 要上传的数据对象
   * @returns {Promise<boolean>} 上传是否成功
   */
  async uploadData(data) {
    try {
      const jsonContent = JSON.stringify(data, null, 2);
      
      const result = await this.cos.putObject({
        Bucket: this.config.Bucket,
        Region: this.config.Region,
        Key: this.cloudFilePath,
        Body: jsonContent,
        ContentType: 'application/json',
        Headers: {
          'x-cos-meta-updated-by': 'whistle-host-manager',
          'x-cos-meta-updated-at': new Date().toISOString()
        }
      });

      console.log('数据上传到腾讯云成功:', result.Location);
      return true;
    } catch (error) {
      console.error('上传数据到腾讯云失败:', error.message);
      return false;
    }
  }

  /**
   * 从腾讯云下载数据
   * @returns {Promise<Object|null>} 下载的数据对象，失败返回null
   */
  async downloadData() {
    try {
      const result = await this.cos.getObject({
        Bucket: this.config.Bucket,
        Region: this.config.Region,
        Key: this.cloudFilePath
      });

      if (result.Body) {
        const jsonContent = result.Body.toString();
        const data = JSON.parse(jsonContent);
        console.log('从腾讯云下载数据成功');
        return data;
      }
      
      return null;
    } catch (error) {
      console.error('从腾讯云下载数据失败:', error.message);
      return null;
    }
  }

  /**
   * 检查云端文件是否存在
   * @returns {Promise<boolean>} 文件是否存在
   */
  async fileExists() {
    try {
      await this.cos.headObject({
        Bucket: this.config.Bucket,
        Region: this.config.Region,
        Key: this.cloudFilePath
      });
      return true;
    } catch (error) {
      return false;
    }
  }

  /**
   * 获取云端文件的最后修改时间
   * @returns {Promise<Date|null>} 最后修改时间，失败返回null
   */
  async getLastModified() {
    try {
      const result = await this.cos.headObject({
        Bucket: this.config.Bucket,
        Region: this.config.Region,
        Key: this.cloudFilePath
      });
      
      return new Date(result.headers['last-modified']);
    } catch (error) {
      console.error('获取云端文件修改时间失败:', error.message);
      return null;
    }
  }

  /**
   * 同步数据到云端（非阻塞）
   * @param {Object} data 要同步的数据
   */
  syncToCloud(data) {
    // 异步执行，不阻塞主流程
    setImmediate(async () => {
      const success = await this.uploadData(data);
      if (!success) {
        console.warn('云端同步失败，但不影响本地操作');
      }
    });
  }
}

// 创建单例实例
const cosService = new COSService();

module.exports = cosService;
